﻿//Código desenvolvido na integra por Bruno Marques
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlServerCe;
using System.Configuration;

namespace GestaoContas
{
    public partial class FormEducandoSala : Form
    {
        private string _connectionStringJardimBD;
        public FormEducandoSala()
        {
            InitializeComponent();
            _connectionStringJardimBD = ConfigurationManager.ConnectionStrings["ConnectionStringJardimBD"].ConnectionString;
        }

        /// <summary>
        /// Quando o programa arranca preenche automaticamente as combobox do programa, com o ID associado como valor.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormEducandoSala_Load(object sender, EventArgs e)
        {
            PreencherComboboxCrianca();
            PreencherComboboxSala();
            PreencherDataGridView();
        }
        /// <summary>
        /// Efetua pesquisa na base de dados e preenche a combobox criança com o nome desta e o ID. 
        /// </summary>
        private void PreencherComboboxCrianca()
        {
            try
            {
                string query = @"SELECT Nome, CriancaId FROM Crianca";
                SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);

                SqlCeCommand cmd = new SqlCeCommand(query, conn);

                SqlCeDataAdapter da = new SqlCeDataAdapter();
                DataSet ds = new DataSet();

                da.SelectCommand = cmd;

                da.Fill(ds);
                comboBoxCrianca.DisplayMember = "Nome";
                comboBoxCrianca.ValueMember = "CriancaId";
                comboBoxCrianca.DataSource = ds.Tables[0];
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        /// <summary>
        /// Efetua pesquisa na base de dados e preenche a combobox sala com o nome desta e o ID. 
        /// </summary>
        private void PreencherComboboxSala()
        {
            try
            {
                string query = @"SELECT NomeSala, SalaId FROM Sala";
                SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);

                SqlCeCommand cmd = new SqlCeCommand(query, conn);

                SqlCeDataAdapter da = new SqlCeDataAdapter();
                DataSet ds = new DataSet();

                da.SelectCommand = cmd;

                da.Fill(ds);
                comboBoxSala.DisplayMember = "NomeSala";
                comboBoxSala.ValueMember = "SalaId";
                comboBoxSala.DataSource = ds.Tables[0];
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        /// <summary>
        /// Preenche todos os dados do formulário, efectuando uma nova pesquisa à base de dados, recolhendo a informação necessária, tal como Data de Nascimento, a informação se frequenta ou não o jardim de infância e se já tem sala, qual.
        /// </summary>
        private void PreencherDadosForm()
        {
            comboBoxSala.Enabled = true ;
            buttonInserir.Enabled = true ;
            string query = @"SELECT DataNascimento, Frequenta,Sala_SalaId FROM Crianca WHERE CriancaId = " + comboBoxCrianca.SelectedValue + "";
            SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);
            conn.Open();
            SqlCeCommand cmd = new SqlCeCommand(query, conn);

            SqlCeDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
            {
                dateTimePicker1.Value = DateTime.Parse(dr["DataNascimento"].ToString());
                checkBoxFrequenta.Checked = bool.Parse(dr["Frequenta"].ToString());
                if (dr["Sala_SalaId"].ToString() == "") // Senão tem sala, desabilitar o botão remover.
                {
                    buttonRemover.Enabled = false;
                }
                else if (dr["Sala_SalaId"] != null) //Se tem sala, desabilitar o botão inserir e retirar a possibilidade de lhe atribuir uma nova sala.
                {
                    comboBoxSala.Enabled = false;
                    buttonInserir.Enabled = false;
                    buttonRemover.Enabled = true;
                }
            }

            if (checkBoxFrequenta.Checked == false) //Se não frequenta a escola, retirar a possibilidade de lhe atribuir uma sala.
                buttonInserir.Enabled = false;
            
            conn.Close();
        }

        /// <summary>
        /// Sempre que a criança for selecionada, preencher os dados do formulário.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxCrianca_SelectedIndexChanged(object sender, EventArgs e)
        {
            PreencherDadosForm(); 
        }

        /// <summary>
        /// Sempre que o utilizador clica no botão inserir, este evento irá atribuir uma sala à criança.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonInserir_Click(object sender, EventArgs e)
        {
            SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);
            conn.Open();
            try
            {
                string varSql = "UPDATE Crianca SET Sala_SalaId = " + comboBoxSala.SelectedValue + " WHERE CriancaId = " + comboBoxCrianca.SelectedValue + "";
                SqlCeCommand cmd = new SqlCeCommand(varSql, conn);
                cmd.ExecuteNonQuery();
                MessageBox.Show("A criança tem agora uma sala atribuída!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro! A sala não foi atribuida", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            conn.Close();
            ActualizarForm();
        }

        /// <summary>
        /// Remove a sala da criança.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonRemover_Click(object sender, EventArgs e)
        {
            SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);
            conn.Open();
            try
            {
                string varSql = "UPDATE Crianca SET Sala_SalaId = NULL WHERE CriancaId = " + comboBoxCrianca.SelectedValue + "";
                SqlCeCommand cmd = new SqlCeCommand(varSql, conn);
                cmd.ExecuteNonQuery();
                MessageBox.Show("Sala removida da criança");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            conn.Close();
            ActualizarForm();
        }

        /// <summary>
        /// Este método preenche a Data grid view com a informação estritamente necessária para mostrar a informação toda da criança juntamente com a sala onde esta está.
        /// </summary>
        private void PreencherDataGridView()
        {
            //A data grid view permite ao utilizador poder inserir novos dados, não é o que se quer, portanto desabilita-se algumas funcionalidades.
            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.Rows.Clear(); //Sempre que for chamada este método, limpar a Grid View
            dataGridView1.Columns.Clear();

            SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);
            conn.Open();
            // É necessário um INNER join para juntar a informação da sala com a informação da criança.
            string query = @"SELECT Crianca.Nome, Crianca.Frequenta, Sala.NomeSala, Crianca.Sala_SalaId, Sala.SalaId FROM Crianca INNER JOIN Sala ON Crianca.Sala_SalaId = Sala.SalaId";
            SqlCeCommand cmdDataGrid = new SqlCeCommand(query, conn);
            SqlCeDataReader drDataGrid = cmdDataGrid.ExecuteReader();

            dataGridView1.Columns.Add("Nome", "Nome");
            dataGridView1.Columns.Add("Frequenta", "Frequenta");
            dataGridView1.Columns.Add("Nome da Sala", "Nome da Sala");

            int idxLinha = 0;
                        
            while (drDataGrid.Read())
            {
                DataGridViewRow linha = new DataGridViewRow();
                dataGridView1.Rows.Add(linha);
                dataGridView1.Rows[idxLinha].Cells[0].Value = drDataGrid[0].ToString(); //Adiciona informação sobre o nome da criança.
                string frequenta = drDataGrid[1].ToString(); //Como a informação na base de dados é boolean e está em inglês, é necessário "traduzir" para português.
                if (frequenta == "True")
                    dataGridView1.Rows[idxLinha].Cells[1].Value = "Sim";
                else
                    dataGridView1.Rows[idxLinha].Cells[1].Value = "Não";
                dataGridView1.Rows[idxLinha].Cells[2].Value = drDataGrid[2].ToString(); //Adiciona informação sobre o nome da sala

                idxLinha = idxLinha + 1;
            }

            drDataGrid.Close(); //Fechar a data grid view.
            conn.Close();
        }
        private void ActualizarForm()
        {
            PreencherDataGridView();
            PreencherDadosForm();
        }
    }

}
